#include"apue.h"
static int msgid_ctos;
static int msgid_stoc;
Msg_ctos msg_ctos1;
Msg_ctos msg_ctos2;
Msg_stoc msg_stoc;

void login(void)
{
	char cli_path [255] = {};
	sprintf(cli_path,"%s%u",ACCOUNT_PATH,msg_ctos1.m_cli.cliid);

	int fd = open(cli_path,O_RDWR);
	if(-1 == fd)
	{
		strcpy(msg_stoc.m_str,"no");
		perror("open");
		return;
	}
	int ret = read(fd,&msg_ctos2.m_cli,sizeof(msg_ctos2.m_cli));
	if(0 >= ret)
	{
		perror("read");
		return ;
	}
	if(msg_ctos2.m_cli.lock < 3)
	{
		if(strcmp(msg_ctos2.m_cli.passwd,msg_ctos1.m_cli.passwd) == 0)
		{
			strcpy(msg_stoc.m_str,"yes");
		}
		else
		{
			strcpy(msg_stoc.m_str,"no");
			msg_ctos2.m_cli.lock++;
		}
	}
	else
	{
		strcpy(msg_stoc.m_str,"lock");
	}
	lseek(fd,SEEK_SET,0);
    if( write(fd,&msg_ctos2.m_cli,sizeof(msg_ctos2.m_cli)) <= 0)
    {
	   perror("write");
	   return ;
    }
	close(fd);
}

int main()
{
	msgid_ctos = get_ctos_msg();
	msgid_stoc = get_stoc_msg();

	while(1)
	{
		if(-1 == msgrcv(msgid_ctos,&msg_ctos1,sizeof(msg_ctos1),MLOGIN,0))
		{
			perror("msgrcv");
		}

		login();

		msg_stoc.m_type = msg_ctos1.m_pid;

		if(-1 == msgsnd(msgid_stoc,&msg_stoc,sizeof(msg_stoc.m_str),0))
		{
			perror("msgsnd");
		}
	}
}
